#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys
import tkinter as tk
from tkinter import ttk
import traceback
import importlib

# 尝试导入ttkbootstrap，提供更有用的错误信息
ttkb = None
try:
    import ttkbootstrap as ttkb
    # 确保ttkbootstrap的资源能被访问到
    import ttkbootstrap.style
    import ttkbootstrap.widgets
    import ttkbootstrap.dialogs
except ImportError:
    # 如果导入失败，提供更有用的错误信息
    print("错误：无法导入ttkbootstrap模块")
    print("请确保已安装ttkbootstrap: pip install ttkbootstrap")
    # 创建一个简单的错误对话框
    root = tk.Tk()
    root.title("错误")
    tk.Label(root, text="无法导入ttkbootstrap模块\n请确保已安装ttkbootstrap: pip install ttkbootstrap").pack(padx=20, pady=20)
    tk.Button(root, text="确定", command=root.destroy).pack(pady=10)
    root.mainloop()
    sys.exit(1)

from gui import ZipToolGUI
from utils import Utils

def setup_exception_handler():
    """设置全局异常处理器"""
    def show_error(exc_type, exc_value, exc_traceback):
        """显示错误对话框"""
        error_msg = ''.join(traceback.format_exception(exc_type, exc_value, exc_traceback))
        
        # 创建错误对话框
        error_window = tk.Toplevel()
        error_window.title("错误")
        error_window.geometry("600x400")
        
        # 添加错误信息
        frame = ttk.Frame(error_window, padding=10)
        frame.pack(fill=tk.BOTH, expand=True)
        
        ttk.Label(frame, text="程序遇到了一个错误:", font=("Arial", 12, "bold")).pack(anchor=tk.W, pady=(0, 10))
        
        # 使用滚动文本框显示错误详情
        error_text = tk.Text(frame, wrap=tk.WORD, height=15)
        error_text.pack(fill=tk.BOTH, expand=True)
        error_text.insert(tk.END, error_msg)
        error_text.config(state=tk.DISABLED)
        
        # 添加滚动条
        scrollbar = ttk.Scrollbar(error_text, orient=tk.VERTICAL, command=error_text.yview)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        error_text.config(yscrollcommand=scrollbar.set)
        
        # 添加关闭按钮
        ttk.Button(frame, text="关闭", command=error_window.destroy).pack(pady=10)
        
        # 确保错误窗口在主窗口之上
        error_window.transient(root)
        error_window.grab_set()
        
        # 打印到控制台
        print(error_msg, file=sys.stderr)
    
    # 设置异常处理器
    sys.excepthook = show_error

def check_dependencies():
    """检查必要的依赖是否已安装"""
    missing_deps = []
    
    try:
        import zipfile
    except ImportError:
        missing_deps.append("zipfile")
    
    try:
        import tarfile
    except ImportError:
        missing_deps.append("tarfile")
    
    try:
        import gzip
    except ImportError:
        missing_deps.append("gzip")
    
    try:
        import py7zr
    except ImportError:
        missing_deps.append("py7zr")
    
    if missing_deps:
        print(f"警告: 缺少以下依赖: {', '.join(missing_deps)}")
        print("请使用 pip install py7zr 安装缺失的依赖")
        
        # 如果缺少关键依赖，显示警告对话框
        if "py7zr" in missing_deps:
            from tkinter import messagebox
            messagebox.showwarning(
                "缺少依赖",
                "缺少 py7zr 库，7z 格式将不可用。\n\n"
                "请使用以下命令安装：\n"
                "pip install py7zr"
            )
    
    return len(missing_deps) == 0

def main():
    """主函数"""
    global root
    
    # 创建根窗口 - 使用ttkbootstrap主题窗口
    # 可选主题: cosmo, flatly, darkly, journal, readable, united, sandstone, 
    #          cerulean, minty, lumen, solar, cyborg, superhero, yeti, pulse,
    #          materia, simplex
    root = ttkb.Window(themename="cosmo")
    
    # 设置DPI感知（Windows）
    try:
        from ctypes import windll
        windll.shcore.SetProcessDpiAwareness(1)
    except (ImportError, AttributeError):
        pass
    
    # 设置异常处理
    setup_exception_handler()
    
    # 检查依赖
    check_dependencies()
    
    # 创建临时目录
    Utils.ensure_dir_exists(Utils.get_temp_dir())
    
    # 创建并运行GUI
    app = ZipToolGUI(root)
    root.mainloop()

if __name__ == "__main__":
    main()